package com.clf.data.redis.core.json.ops;

import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.ScanOptions;

import java.util.*;
import java.util.concurrent.TimeUnit;


/**
 * ops覆盖接口，用于动态代理
 * 
 * @author <a href="mailto:zhudelie@zuozh.com">zhudelie</a>
 * @version
 * @since JDK 1.6 create on 2017年3月31日 Copyright 2017 ZZJR All Rights Reserved.
 *
 */
public interface FastJsonBoundHashOperations<K, HK, HV> extends BoundHashOperations<K, HK, HV> {
	//@Deprecated
	//void put(HK hashKey, HV value, DBExecutor<HV> db);

	//@Deprecated
	//void put(HK hashKey, HV value, DBExecutor<HV> db, Long timeout, TimeUnit unit);

	//@Deprecated
	//HV get(HK hashKey, DBExecutor<HV> db);

	//@Deprecated
	//HV get(HK hashKey, DBExecutor<HV> db, Long timeout, TimeUnit unit);

	/**
	 * 根据hashkey，获得指定类型的值
	 * @param hashKey
	 * @param type
	 * @return
	 */
	<T> T get(HK hashKey, Class<T> type);
	
	//@Deprecated
	//<T> T get(HK hashKey, Class<T> type, DBExecutor<T> db);

	//@Deprecated
	//<T> T get(HK hashKey, Class<T> type, DBExecutor<T> db, Long timeout, TimeUnit unit);

	/**
	 * 获得当前key
	 */
	@Override
	K getKey();
	/**
	 * 获得当前存储的类型
	 */
	@Override
	DataType getType();
	/**
	 * 获得过期时间
	 */
	@Override
	Long getExpire();
	/**
	 * 设置过期时间
	 */
	@Override
	Boolean expire(long timeout, TimeUnit unit);
	/**
	 * 设置过期日期
	 */
	@Override
	Boolean expireAt(Date date);
	/**
	 * 撤销过期时间
	 */
	@Override
	Boolean persist();
	/**
	 * 重新设置key
	 */
	@Override
	void rename(K newKey);
	/**
	 * 删除hashkey
	 */
	@Override
	Long delete(Object... keys);
	/**
	 * 包含hashkey
	 */
	@Override
	Boolean hasKey(Object key);
	/**
	 * 根据hashkey得到value
	 */
	@Override
	HV get(Object key);
	/**
	 * 根据多个hashkey得到多个value
	 */
	@Override
	List<HV> multiGet(Collection<HK> keys);
	/**
	 * 指定key自增指定大小
	 */
	@Override
	Long increment(HK key, long delta);
	/**
	 * 指定key自增指定大小
	 */
	@Override
	Double increment(HK key, double delta);
	/**
	 * 得到所有hashkey
	 */
	@Override
	Set<HK> keys();
	/**
	 * 得到个数
	 */
	@Override
	Long size();
	/**
	 * 设置多个值
	 */
	@Override
	void putAll(Map<? extends HK, ? extends HV> m);
	/**
	 * 设置值
	 */
	@Override
	void put(HK key, HV value);
	/**
	 * 设置值，如果该hashkey下的值不存在
	 */
	@Override
	Boolean putIfAbsent(HK key, HV value);
	/**
	 * 得到所有值
	 */
	@Override
	List<HV> values();
	/**
	 * 得到所有key和值
	 */
	@Override
	Map<HK, HV> entries();
	/**
	 * 得到游标
	 */
	@Override
	Cursor<Map.Entry<HK, HV>> scan(ScanOptions options);
	/**
	 * 得到操作对象
	 */
	@Override
	RedisOperations<K, ?> getOperations();

}
